/**
 * This file is used specifically for security reasons.
 * Here you can access Nodejs stuff and inject functionality into
 * the renderer thread (accessible there through the "window" object)
 *
 * WARNING!
 * If you import anything from node_modules, then make sure that the package is specified
 * in package.json > dependencies and NOT in devDependencies
 *
 * Example (injects window.myAPI.doAThing() into renderer thread):
 *
 *   import { contextBridge } from 'electron'
 *
 *   contextBridge.exposeInMainWorld('myAPI', {
 *     doAThing: () => {}
 *   })
 *
 * WARNING!
 * If accessing Node functionality (like importing @electron/remote) then in your
 * electron-main.ts you will need to set the following when you instantiate BrowserWindow:
 *
 * mainWindow = new BrowserWindow({
 *   // ...
 *   webPreferences: {
 *     // ...
 *     sandbox: false // <-- to be able to import @electron/remote in preload script
 *   }
 * }
 */

import { contextBridge, ipcRenderer, IpcRendererEvent } from "electron";

contextBridge.exposeInMainWorld("ipcRenderer", {
  on: (channel: string, listener: (...args: any[]) => void): (() => void) => {
    const subscription = (event: IpcRendererEvent, ...args: any[]) =>
      listener(...args);

    // 注册监听
    ipcRenderer.on(channel, subscription);

    // 返回一个清理函数
    return () => {
      ipcRenderer.removeListener(channel, subscription);
    };
  },
  send: (channel: string) => {
    // 注册监听
    ipcRenderer.send(channel);
  },
});
